﻿第二天

進入 http://jendo.org/phpMyAdmin/
帳號：assistant
密碼：20120511
jendo
day6WpDS106

助理們->選上面的結構
有四個欄位，
第一個id欄類型是tinyint
指tiny（小小）的int（整數）：意思是只使用1個byte
1byte有256個可能
如果是非負整數，
可代表0~255

屬性unsigned是非負的意思，不存負值

第二個name欄位類型
var（可變長度）的char（字元），也可以vchar
記錄形式會用第一個byte記多長，然後再放實際的資料
mySQL4.1以前是用1個byte記錄，可記錄255個長度
mySQL4.2以後用2個byte來記錄，可記錄65535個長度
在utf8中，每個中文字用掉3個byte（這樣才能簡中繁中日韓文都放在同一頁），不同於big5每個中文字只用2個byte。
另外有一種char的類型，每個欄位長度是定長
姓名欄的長度直接下255，這樣在mySQL4.1以前也可相容
排序規則/校對方式 的 utf8_general_ci的意思是
utf8是編碼
general_ci是校對排序方式，不同國家希望有不同的排序方式，而華文最喜歡的排序方式是general_ci（大體上照utf8本身的大小排序），這裡不用非負屬性，因為文字不需要正負

第三個gender欄位類型，發現gender底下有虛線，代表這欄有註釋，按一下「操作」中的「修改」，便可看到0和1各代表什麼意思

第四個birthday欄位，類型是用date，因為不一定所有的日期是合理的，尤其是閏年，用這個類型會幫你檢查，所以要定義好相關的適合型態。

按操作，允許你對資料表進行處理
操作右邊，
「將資料表移動到(資料庫名.資料資料表名稱)：」
「將資料表複製到(資料庫名.資料資料表名稱)：」（練習這個）
你在執行什麼事的時候，mySQL都會把這個動作寫出程式碼
刪除的時候會刪掉一筆，所以沒有select哪筆欄的某欄位出現
練習編輯的動作MySQL的指令是update
UPDATE `助理們`.`nameonotmyname` SET `id` = '1' WHERE `nameonotmyname`.`id` =2;

所以select,delete,update是三個mySQL中最重要的指令
其他指令，詳見 http://jendo.org/et/doc/MySQL.html
第二部分->零->七、基本SQL命令
10~14、
如何打出這些指令？在介面最上端，有「SQL」的欄位

匯出，以SQL格式輸出
並以emeditor打開
--或/*都是註解，不理他
CREATE TABLE IF NOT EXISTS `linyi` (
  `id` tinyint(1) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `gender` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0代表女生;1代表男生',
  `birthday` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;

這一段中「`linyi`」的「``」是用來括著資料庫、資料表、或欄位名稱的括弧，因為他允許用保留字來取代欄名（e.g.insert、update等），可以不用這個括弧，但要注意沒有用保留字，

數字：沒有值是0，NULL是連數字屬性都沒有
字串：空白還不夠空；而是空字串''或""（引號中沒有任何字串，寬度為0）；但比空字串還要空，NULL是連字串屬性都沒有
字串的null和數字的null的意思是一樣的，null自己就是資料型別，在資料類型中，必須思考這個欄位能不能有null值
auto_increment是自動遞增
default是預設值
comment是註解
primary key是「主鍵」，憑什麼去區別兩筆資料的不同？在這邊是憑id欄位的欄值
括號結束後，告訴你資料引擎是MyISAM，是MySQL可以用的幾種資料庫引擎的，charset（編碼）是用utf8，auto_increment=8是表示這個表建到哪裡了（這是常常需要修改的地方）

INSERT INTO `linyi` (`id`, `name`, `gender`, `birthday`) VALUES
(2, '丁志仁', 0, '1961-05-19'),
(3, '蕭嘉敏', 0, '1978-01-21'),
(4, '張溫瑜', 0, '1980-02-08'),
(5, '李俊德', 1, '1999-01-01'),
(6, '上官良治', 1, '1985-06-26'),
(7, '陳林毅', 1, '2010-05-05');

回到phpMyAdmin中，進入操作
「刪除資料或資料表」中，清空是指保留結構、刪除是指全刪

刪除的時候會遇到bug
唯一可以刪除的方法是進到「助理們」資料夾，勾選要刪除的資料表，在選中項勾「刪除」

下載格式改成csv，這是異類資料庫最常用的交換檔案格式
這個格式不管結構，只有內容
這種格式各家資料庫都認得，但excel預設的編碼是big5，所以打開會不正常
在excel2007需要進「資料」->「取得外部資料」的「從文字檔」，就可以選擇編碼格式為utf8
如果用excel匯出的話，會沒有雙引號

現在再把excel匯出的檔案再用EmEditor另存新檔
檔案最前面的3個byte，BOM會有字元表示是UTF8文件
但是CSV如果檔案中有BOM，會被誤認為資料

換行，各作業系統的約定編碼皆不同
Windows：2個byte
	carried return（從末行調到行首）
	line feed（餵新一行）
Mac：1個byte
	carried return（從末行調到行首）
Linux：1個byte
	line feed（餵新一行）

以上的匯出匯入的編碼注意事項，在未來建立資料庫時會很好用



接下來
教php

從NAS下載 http://jendo.org/jendo/preparation/助理教育訓練/助理通訊錄.php

伺服器端，分成html以及php code兩個段落
<?php
...
?>

本地端，請求伺服器的時候，伺服器會把php那部分的東西做一做，在伺服器端執行完成，弄成html傳給本地端。

	html包含
		a.tag
		b.CSS
		c.javascript

	php code包含
		a.php
		b.mySQL

範例
html-><Html>
css -><link href='pa.txt' rel='stylesheet'/>
html-><Body>
php -><?php
php ->	$link=mysql_connect("localhost", "assistant", "20120511");
        ^變數的前置資料，$link是一個容器
              mysql_connect我要連結mySQL資料庫中的函式。提供三個引數
			a.localhost表示我這隻提出連接請求的php跟這資料庫是在同一台機器中（有同一台機器、指定機器、任意機器三種設定）
			b.給帳號，說明自己是誰
			c.給密碼，證明自己是那個誰
		在php的等號，不是等於的意思，是把左方的數值派入右方（派值）
		兩個等號是比較，到底左方跟右方有沒有一樣，若他們資料一樣，資料型別不同沒關係（e.g.字串123與文字123是相同的，123=='123'會傳回真值）
		三個等號是比較，到底左方跟右方有沒有完全一樣（e.g.字串123與文字123是不同的，123==='123'會傳回假值）
		分號有兩個含意
			a.執行
			b.本指令結束
php ->	mysql_query("set names utf8");
	查詢指令，上一行本地端應該是連上了伺服器端了，講好要用哪個編碼來溝通
	names是「命名空間」「名字空間」
php ->	mysql_select_db("助理們");
	選定哪個資料庫底下執行（mySQL很少允許用跨資料庫的執行）
php ->	$result = mysql_query("SELECT a.id,a.name,a.birthday,b.phone,c.email FROM name a,phone b,email c WHERE a.id=b.id and a.id=c.id order by a.id");
	^^^^^^^把MySQL回傳的二維陣列傳到result這個變數中
	query這是昨天學過的，三張表可以用兩個表連結串起來
php ->	echo "<table>\n";
	mySQL會給你二維陣列，標準輸出，是html
	以表格來呈現
	\n是line feed（新增一行）
	\r是carry return（調到行首）
	\t是tab（定位點）
php ->	echo "<tr><th>id</th><th>姓名</th><th>生日</th><th>電話</th><th>Email</th></tr>";
	輸出的html表格碼
php ->	while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
	while意思是「如果條件成立，一直做」，只要小括號裡頭的條件成立，大括號的內容就一直做
	fetch_array的指令就是把輸出的二維陣列每次都劈下一筆，每次會拿到一筆資料
	把這個劈下一筆的資料放進$row的變數中
	直到二維陣列所的資料都被你劈完，就會回傳為假，指令執行結束
	MySQL_Assoc的意思
	我可以用字來稱呼每欄（assoc），但也可以用第0欄第1欄...第4欄的方式稱呼各欄（可以去講義找，是index編碼）
php ->		echo "<tr>";
	每劈下一筆，就傳一個本列開始
php ->		foreach($row as $value){echo "<td>".$value."</td>";}
	row有五個元素，foreach是指陣列中的每個元素做一次，每次都把元素值as元素名
	.是字串連接符號，.的左右邊都必須是字串，把.左右邊連成一個更長的字串
php ->		echo "</tr>\n";
	接下來傳一個本列結束
php ->	#echo "<tr><td>$row['id']</td><td>$row['name']</td><td>$row['birthday']</td><td>$row['phone']</td><td>$row['email']</td></tr>\n";
	這行是跟上面三行代表一樣的意思，用foreach因為不用管資料名，會比較不容易出錯
php ->	}
php ->	echo "</table>\n";
	table結束，換行
php ->?>
	php結束
html-></Body>
html-></Html>

php code是指令構成的，包含
a.資料
b.處置/演算（算符）=
c.結束（;）
每個指令的結束都是;分號，意思是執行

大括號「{}」是程式區塊，把一群指令包在一起，後面不用加分號
while(條件){...}這個指令有風險，就是如果沒想清楚，可能會有無窮迴圈
foreach(陣列as元素){...}
if(條件){...}elseif(條件){...}else{...}如果男的要冠先生，女的要冠女士，可使用此
for($i=0;$i<5;$i++){...}這個while可以
從何處開始、到哪裡，每次增加的方式（++是+1）


下午的作業是
$str='';
空字串
$str=$str."<table>";
把str越接越長，最後把str全部串起來，
echo $str，讓結果呈現的跟示範程式的結果一樣

寫出來了

下一題，把派值的精簡
可以用$str=$str."XXX"跟$str.="xxx"的概念
$A=$A+5跟$A+=5相同
$A=$A-5跟$A-=5相同
$A=$A*5跟$A*=5相同
（但加減乘除都要再$A代表的是數字值時才可以用）
（.則是文字值的相連）

要注意如果是簡寫的話，=前後不能有空白鍵


下一階段
http://jendo.org/et/doc/php.html

php是一種描述性的語言（每一段都是指另、演算、執行）
（編譯性的語言則是像c或java，不能一行一行打，要交給compiler才能執行）

變數分大小寫，保留字不分大小寫。
e.g.$str不等於$STR
e.g.FOR(...)等於for(...)


嵌入Html的方法：

    短型：<?…?>
    XML型：<?php…?>-->今天主要教的寫法
    SCRIPT型：<SCRIPT language='php'?>…</SCRIPT>
    ASP型：<%…%> 

因為每次php都要花記憶體來算，所以要注意不要太浪費

print_r除了字串外，還可以輸出陣列或物件



std.php
<?php
include_once 'constant.php';
	引進一個常數（定義常數）
if(!isset($_REQUEST['exec_type'])){echo "<link rel='stylesheet' href='".CLASS_HTML_PATH."/database/etable.css' />\n";}
	要去找CLASS_HTML_PATH的url（網路資源位置）中絕對路徑
if(!class_exists('etable')){require_once(CLASS_FILE_PATH."/database/etable.php");}
	要去找CLASS_FILE_PATH這個常數中伺服器中的絕對路徑
$ET=new etable;
	車輪餅的模子
$ET->sql[0]="select money,date,summary,name,subaccount,account_e,account_a from account order by date desc";
	車輪餅的內餡
$ET->main();
	使用函式：要他表現出來
?>

（範例2）你也可以把類別塞到xoops

（範例3）也可以把東西整理成一個文字檔http://jendo.org/diversify3.php（帳號：訪客；密碼：guest）

（範例4）

（範例5）

（範例6）還有中英文的版本，可以有很多語言版本

（範例11）可以選擇不同的車輪餅餡壓出一個車輪餅

（範例12）相異性選單，開平的食材採購也會用到

etable是一個很好的類別範例，以後可以直接倒東西給他用，

constant.php
<?php
if(!isset($_COOKIE['PHPSESSID']) && isset($_REQUEST['PHPSESSID'])){session_id($_REQUEST['PHPSESSID']);}	// 作用於 cookie 關閉時
session_start();
define("CMS",'alone'); 
	常數的名稱,值[常數的位置]
define('CLASS_HTML_PATH','/et/class');
define('CLASS_FILE_PATH','/volume1/web/et/class');
define('DSN',"mysql://jendo:day6WpDS109@localhost/et");
	database source name，值是MySQL的振鐸帳密帶到et這個資料夾
?>

目前以我們的功力，直接照抄這些程式碼

物件包含兩個東西：
屬性[不是html中的atrribute，是不同脈絡中的]->沒有括弧，是變數值
方法->有括弧，是函式

方法可比物件的功能，像是廚房中的多用途開罐器。不鏽鋼製是他的屬性，切鮪魚罐頭的是那個地方，開啤酒蓋是另一個地方，不同的功能用不同的方法。


作業：
寫自己的常數表（可以照抄老師的constant.php），只有如何連接資料庫的地方要改
提示－要導向資料庫的不是et是助理們那資料庫

寫自己的工作程式（可以照抄老師的std.php）
